package com.izhengyin.gateway.base.pojo;

import lombok.Data;
import lombok.ToString;

import java.util.Date;
import java.util.Optional;

/**
 * @author zhengyin  <zhengyin.name@gmail.com>
 * @date Created on 2019/1/9 12:15 PM
 */
@Data
@ToString
public class Metrics {
    /**
     * 网关名
     */
    private String gateway;
    /**
     * 服务名
     */
    private String service;
    /**
     * 自定义接口名（通过 spring @XXXMapping(name = xxx) 指定 ）
     */
    private String name;
    /**
     * 处理接口请求的 Java method
     */
    private String jMethod;
    /**
     * spring 接口描述的mapping
     */
    private String mapping;
    /**
     * 请求的 http method
     */
    private String httpMethod;
    /**
     * 请求 uri
     */
    private String uri;
    /**
     * 响应状态码
     */
    private Integer httpCode;
    /**
     * 请求响应时间
     */
    private Long resTimeMs;
    /**
     * UA
     */
    private String userAgent;
    /**
     * 请求来源IP
     */
    private String clientIp;
    /**
     * 当发送错误时的类别
     */
    private String errorType;
    /**
     * 当发送错误时的描述
     */
    private String errorMessage;
    /**
     * 链路追踪 traceId
     */
    private String traceId;
    /**
     * 链路追踪 spanId
     */
    private String spanId;
    /**
     * 是否开启了采样
     */
    private Boolean sampled;
    /**
     * 请求时间
     */
    private Date timestamp;

    /**
     * 使用 | 杠分割日志可以减少日志的空间占用
     * @return
     */
    public String toDelimiterString(){
        return gateway +
                "|" + service +
                "|" + name +
                "|" + mapping +
                "|" + jMethod +
                "|" + uri +
                "|" + httpCode +
                "|" + resTimeMs +
                "|" + userAgent +
                "|" + clientIp +
                "|" + errorType +
                "|" + errorMessage +
                "|" + traceId +
                "|" + spanId +
                "|" + Optional.ofNullable(sampled).filter(Boolean::booleanValue).map(b -> 1).orElse(0);
    }
}